<?php

	function format($value, $type)
	{
		switch ($type[0]) {
			case 'a':
				$second_type = !empty($type[1]) ? $type[1] : 's';
				if (is_array($value)) {
					$result = array();
					foreach ($value as $k => $v) {
						$result[$k] = format($v, $second_type);
					}
				} else {
					$result = format($value, $second_type);
				}
				break;
			case 's':
				$result = strval($value);
				break;
			case 'i':
				$result = intval($value);
				break;
			default:
				$result = strval($value);
		}

		return $result;
	}

	function arg($name, $type = 's', $from = 'r')
	{
		foreach (explode(',', $from) as $method) {
			switch ($method) {
				case 'r':
					if (isset($_REQUEST[$name])) $result = $_REQUEST[$name];
					break;
				case 'g':
					if (isset($_GET[$name])) $result = $_GET[$name];
					break;
				case 'p':
					if (isset($_POST[$name])) $result = $_POST[$name];
					break;
				case 's':
					if (isset($_SESSION[$name])) $result = $_SESSION[$name];
					break;
				case 'c':
					if (isset($_COOKIE[$name])) $result = $_COOKIE[$name];
					break;
				default:
					return null;
			}

			if (isset($result)) break;
		}
		if (!isset($result)) return null;


		return format($result, $type);
	}

	function fetchObject(&$obj, $array)
	{
		if (!is_array($array)) {
			throw new AppException('Invalid param', System_Errors::ERROR_SYSTEM_UNKNOWN);
		}

		foreach ($obj as $k => $v) {
			if (!isset($array[$k])) continue;

			switch (gettype($v)) {
				case 'integer':
					$v = intval($array[$k]);
					break;
				case 'float':
					$v = floatval($array[$k]);
					break;
				default:
					$v = strval($array[$k]);
			}
			$obj->$k = $v;
		}
	}

	function bgExec($cmd)
	{
		if (substr(php_uname(), 0, 7) == "Windows") {
			pclose(popen("start /B " . $cmd, "r"));
		} else {
			exec($cmd . " > /dev/null &");
		}
	}

	function nl2p($string, $line_breaks = true, $xml = true)
	{
		$string = str_replace(array('<p>', '</p>', '<br>', '<br />'), '', $string);

		if ($line_breaks == true) {
			return '<p>' . preg_replace(array("/([\n]{2,})/i", "/([^>])\n([^<])/i"), array("</p>\n<p>", '<br' . ($xml == true ? ' /' : '') . '>'), trim($string)) . '</p>';
		} else {
			return '<p>' . preg_replace("/([\n]{1,})/i", "</p>\n<p>", trim($string)) . '</p>';
		}
	}

	function str2date($format, $date_string)
	{
		$date_string = strtr($date_string, array(
			'Пн'       => 'Mon',
			'Вт'       => 'Tue',
			'Ср'       => 'Wed',
			'Чт'       => 'Thu',
			'Пт'       => 'Fri',
			'Сб'       => 'Sat',
			'Вс'       => 'Sun',

			'Янв'      => 'Jan',
			'Фев'      => 'Feb',
			'Мар'      => 'Mar',
			'Апр'      => 'Apr',
			'Май'      => 'May',
			'Июн'      => 'Jun',
			'Июл'      => 'Jul',
			'Авг'      => 'Aug',
			'Сен'      => 'Sep',
			'Окт'      => 'Oct',
			'Ноя'      => 'Nov',
			'Дек'      => 'Dec',

			'Января'   => 'Jan',
			'Февраля'  => 'Feb',
			'Марта'    => 'Mar',
			'Апреля'   => 'Apr',
			'Мая'      => 'May',
			'Июня'     => 'Jun',
			'Июля'     => 'Jul',
			'Августа'  => 'Aug',
			'Сентября' => 'Sep',
			'Октября'  => 'Oct',
			'Ноября'   => 'Nov',
			'Декабря'  => 'Dec',
		));

		$date   = DateTime::createFromFormat($format, $date_string);
		$result = $date ? $date->format('Y-m-d H:i:s') : null;

		return $result;
	}

	if (!function_exists('mb_ucfirst') && function_exists('mb_substr')) {
		function mb_ucfirst($string) {
			$string = mb_strtoupper(mb_substr($string, 0, 1)) . mb_substr($string, 1);
			return $string;
		}
	}